/*
    jsoncpp库的基本使用
*/

#include <iostream>
#include <json/json.h> // /usr/local/include/json
#include <sstream>
#include <memory>

// 序列化
bool serialize(const Json::Value& value, std::string& json_str)
{
    // Json::StreamWriter 序列化类：用于将value数据序列化为json格式字符串的类
    // Json::StreamWriterBuilder 工厂类：用于生产StreamWriter类对象

    // 1、利用工厂类对象创建StreamWriter对象
    Json::StreamWriterBuilder swb;
    swb.settings_["emitUTF8"] = true;
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

    // 2、序列化
    std::stringstream ss;
    int ret = sw->write(value, &ss);
    if(ret != 0)
        return false;

    json_str = ss.str();
    return true;
}

bool unSerialize(const std::string& json_str, Json::Value& val)
{
    // Json::CharReader 反序列化类：用于将json格式字符串反序列化成Value类型
    // Json::CharReaderBuilder 工厂类：用于创建CharReader类对象

    // 1、利用工程类创建CharReader对象
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    // 2、反序列化
    std::string err;
    bool ret = cr->parse(json_str.c_str(), json_str.c_str() + json_str.size(), &val, &err);
    if(ret == false)
        return false;
    return true;
}

int main()
{
    char name[] = "张三";
    int age = 24;
    float score[3] = {88, 89.5, 99};

    Json::Value stu;
    stu["姓名"] = name;
    stu["年龄"] = age;
    stu["成绩"].append(score[0]);
    stu["成绩"].append(score[1]);
    stu["成绩"].append(score[2]);

    std::string stu_str;
    if(!serialize(stu, stu_str)) // 序列化成json格式的字符串
        std::cout << "序列化失败\n";
    std::cout << stu_str << std::endl;

    Json::Value val;
    if(!unSerialize(stu_str, val)) // 反序列化
        std::cout << "反序列化失败\n";
    std::cout << val["姓名"].asString() << std::endl;
    std::cout << val["年龄"].asInt() << std::endl;
    int sz = val["成绩"].size();
    for(int i = 0; i < sz; i++)
    {
        std::cout << val["成绩"][i].asFloat() << " ";
    }
    std::cout << std::endl;
    return 0;
}